package top.hkyzf.study.leetcode.linkedlist;

import org.junit.Test;

/**
 * @author 朱峰
 * @date 2020-12-21 14:03
 */
public class 删除链表的节点_剑指Offer18 {

    ListNode head = new ListNode(0);

    // 添加节点
    public void add(ListNode node) {
        // 由于head节点不可移动，定义一个临时节点
        ListNode temp = head;
        while (true) {
            // 找到最后了
            if(temp.next == null) {
                break;
            }
            // 没有找到最后则temp后移继续循环
            temp = temp.next;
        }
        // 将新节点添加到链表最后
        temp.next = node;
    }

    // 列出链表所有元素
    public void list(ListNode listNode) {
        // 先判断链表是否为空
        if(listNode == null) {
            System.out.println("链表为空！");
            return;
        }
        // 不为空，开始遍历，由于head节点不可移动，定义一个临时节点
        ListNode temp = listNode;
        while (true) {
            // 先打印链表当前节点
            System.out.println(temp);
            // 判断下一节点是否为空，为空则遍历完毕，退出循环
            if(temp.next == null) {
                break;
            }
            // 有值则游标后移
            temp = temp.next;
        }
    }

    // 删除链表中的元素
    public ListNode deleteNode(ListNode head, int val) {
        // 先判断链表是否为空
        if (head == null) {
            System.out.println("链表为空，不可删除！");
            return null;
        }
        // 要删除头节点
        if (head.val == val) {
            return head.next;
        }
        // 由于head节点不可移动，定义一个临时节点
        ListNode temp = head;
        boolean flag = false;
        while (true) {
            // 找到最后了
            if(temp.next == null) {
                System.out.println("没有num为 " + val + " 的英雄，删除失败！");
                break;
            }
            // 判断下一个节点的num是否跟传过来的num一致
            if(temp.next.val == val) {
                flag = true;
                break;
            }
            // 没有找到最后则temp后移继续循环
            temp = temp.next;
        }
        // 找到了，开始删除
        if(flag) {
            temp.next = temp.next.next;
            System.out.println("删除成功了！");
        }
        return head;
    }

    @Test
    public void getKthFromEnd() {
        ListNode heroNode1 = new ListNode(-3);
        ListNode heroNode2 = new ListNode(5);
        ListNode heroNode3 = new ListNode(-99);
        this.add(heroNode1);
        this.add(heroNode2);
        this.add(heroNode3);
        this.list(head);
        ListNode listNode = this.deleteNode(head, 0);
        this.list(listNode);
    }

}
